use winreg::enums::HKEY_LOCAL_MACHINE;
use winreg::RegKey;
use std::path::PathBuf;
use std::env;
use std::fs;
use std::io::Cursor;
// use image::io::Reader as ImageReader;
use eframe::NativeOptions;
use egui::ViewportBuilder; // 从 egui 模块导入 ViewportBuilder
use eframe::egui;
use ico::IconDir;
#[cfg(not(target_os = "windows"))]
/// 检查函数，用于验证某些条件或状态
///
/// # Returns
/// * `bool` - 总是返回 true，表示通过检查
pub fn check() -> bool {
    true
}

#[cfg(target_os = "windows")]
pub fn check() -> bool {

    let webview2_installed = is_webview2_installed();
    if webview2_installed {
        return true;
    }
    // 加载图标文件
    let icon_data_file = include_bytes!(concat!(env!("CARGO_MANIFEST_DIR"), "/src/assets/html-runner.ico")); // 将图标文件嵌入到二进制中
    let icon_dir = IconDir::read(Cursor::new(icon_data_file.as_ref())).expect("Failed to decode .ico file");
    let entry = &icon_dir.entries()[0]; // 选择第一个图标
    let rgba = entry.decode().unwrap().rgba_data().to_vec();    

    let options =  NativeOptions {
        viewport: ViewportBuilder::default()
            .with_icon(egui::viewport::IconData {
                rgba,
                width: entry.width(),
                height: entry.height(),
            })
            .with_title("Colt Html Runner"), // 设置窗口标题
        ..Default::default()
    };
    if let Err(err) = eframe::run_native(
        "HTML Runner",
        options,
        // Box::new(|_cc| Box::new(MyApp)),
        // 使用系统字体
        Box::new(|cc| {
            // 获取 SystemRoot 环境变量
            let system_root =  env::var("SystemRoot").expect("Failed to get SystemRoot environment variable");

            // 构建字体文件路径
            let mut font_path = PathBuf::from(system_root);
            font_path.push("Fonts");
            font_path.push("simsun.ttc");
            let font_data = fs::read(font_path).expect("无法加载字体文件");                
            // 使用系统字体
            let mut fonts = egui::FontDefinitions::default();
            fonts.font_data.insert(
                "Microsoft YaHei".to_owned(),          // 字体名称
                egui::FontData::from_owned(font_data), // 加载字体数据
            );
            fonts
                .families
                .get_mut(&egui::FontFamily::Proportional)
                .unwrap()
                .insert(0, "Microsoft YaHei".to_owned()); // Windows 系统字体
            cc.egui_ctx.set_fonts(fonts);

            Box::new(MyApp)
        })
    ) {
        eprintln!("Failed to run native application: {}", err);
    }
    false
}

struct MyApp;

impl eframe::App for MyApp {
    fn update(&mut self, ctx: &egui::Context, _frame: &mut eframe::Frame) {
        egui::CentralPanel::default().show(ctx, |ui| {
            ui.add_space(50.0); // 增加 20 像素的水平间距
            // 显示普通文本
            ui.vertical_centered(|ui| {
                ui.heading("系统缺少 WebView2 运行时环境，请安装后重试。");
            });           
            ui.add_space(20.0); // 增加 20 像素的水平间距 
            ui.horizontal(|ui| {
                ui.add_space(20.0); // 增加 20 像素的左边距
                // 显示超链接
                if ui.link("点击这里下载 WebView2 安装包").clicked() {
                    // 处理 Result
                    if let Err(err) = webbrowser::open("https://developer.microsoft.com/en-us/microsoft-edge/webview2/?form=MA13LH#download-section") {
                        eprintln!("Failed to open link: {}", err);
                    }
                }
            });
            ui.add_space(20.0); // 增加 20 像素的水平间距
            // 显示普通文本
            let is_below_10 = is_windows_below_10();
            if is_below_10 {           
                ui.horizontal(|ui| {
                    ui.add_space(20.0); // 增加 20 像素的左边距
                    ui.label("如果您的系统是 Windows 10 以下的 系统，您可以尝试安装旧版。");
                });                        
                ui.horizontal(|ui| {
                    ui.add_space(20.0); // 增加 20 像素的左边距
                    if ui.link("点击这里下载适合[Windows7 | Windows8]环境的 edge webview2 runtime 安装包").clicked() {
                        // 处理 Result
                        if let Err(err) = webbrowser::open("https://www.catalog.update.microsoft.com/Search.aspx?q=edge-109") {
                            eprintln!("Failed to open link: {}", err);
                        }
                    } 
                    ui.label("，推荐使用 Stable 版。");
                });                 
                ui.add_space(20.0); // 增加 20 像素的水平间距    
                ui.horizontal(|ui| {
                    ui.add_space(20.0); // 增加 20 像素的左边距
                    ui.label("如果您的系统是 32 位 Windows 系统，请下载 32 位的安装包。");
                });                 
                ui.horizontal(|ui| {
                    ui.add_space(20.0); // 增加 20 像素的左边距
                    ui.label("[谨慎参考]");
                    if ui.link("安装旧版edge webview2 runtime的一些坑").clicked() {
                        // 处理 Result
                        if let Err(err) = webbrowser::open("https://blog.csdn.net/heeeh56/article/details/142764504") {
                            eprintln!("Failed to open link: {}", err);
                        }
                    } 
                }); 
            } 
        });
    }
}

fn is_webview2_installed() -> bool {
    let hklm = RegKey::predef(HKEY_LOCAL_MACHINE);
    let key_path =
        r"SOFTWARE\WOW6432Node\Microsoft\EdgeUpdate\Clients\{F3017226-FE2A-4295-8BDF-00C3A9A7E4C5}";
    let win64i = hklm.open_subkey(key_path).is_ok();
    let key_path32 = r"SOFTWARE\Microsoft\EdgeUpdate\Clients\{F3017226-FE2A-4295-8BDF-00C3A9A7E4C5}";
    let win32i = hklm.open_subkey(key_path32).is_ok();
    win64i || win32i
}
#[cfg(windows_7)]
fn is_windows7_sp1_installed() -> bool {
    let hklm = RegKey::predef(HKEY_LOCAL_MACHINE);
    let key_path = r"SOFTWARE\Microsoft\Windows NT\CurrentVersion";
    if let Ok(key) = hklm.open_subkey(key_path) {
        if let Ok(csd_version) = key.get_value::<String, _>("CSDVersion") {
            return csd_version.contains("Service Pack 1");
        }
    }
    false
}

#[cfg(not(any(windows_7)))]
fn is_windows7_sp1_installed() -> bool {
    false
}

// 新增版本判断函数
#[cfg(target_os = "windows")]
pub fn is_windows_below_10() -> bool {
    let hklm = RegKey::predef(HKEY_LOCAL_MACHINE);
    if let Ok(key) = hklm.open_subkey(r"SOFTWARE\Microsoft\Windows NT\CurrentVersion") {
        // 现代Windows版本检测（Win10+）
        if let Ok(major_version) = key.get_value::<u32, _>("CurrentMajorVersion") {
            return major_version < 10;
        }
        // 传统Windows版本检测（Win8.1及以下）
        if let Ok(version) = key.get_value::<String, _>("ProductName") {
            return version.contains("Windows 7") || 
                   version.contains("Windows 8") ||
                   version.contains("Windows Vista") ||
                   version.contains("XP");
        }
    }
    false
}